【アップデート】AWS IoT Device Management のフリートインデックスでデバイスの位置情報がサポートされました
どういうアップデート?
今回のアップデートで、デバイスの位置情報(緯度、軽度)をフリートインデックスの対象にすることができるようになりました。
これにより、位置情報を元にしたデバイスのクエリを行えるようになりました。例えば「半径2キロメートル以内にあるデバイスの抽出」などがフリートインデックスを使って簡単にできるようになります。
位置情報はデバイスシャドウに保存し、シャドウをインデックスの対象にすることで位置情報をクエリできるようになっています。
やってみる
今回は「都内にある GPS 機能付き自転車」を想定して検証してみることにします。
AWS IoT Core 上の名前 | 自転車がある場所 | 緯度, 経度 | 名前付きシャドウ名 |
---|---|---|---|
Bike-1 |
日比谷フォートタワー前 | 35.669760 , 139.753038 |
Bike-shadow |
Bike-2 |
産報佐久間ビル前 (秋葉原) |
35.697495 , 139.774743 |
Bike-shadow |
(余談:日比谷フォートタワーはクラスメソッドのオフィスがある場所です。産報佐久間ビルは以前オフィスがあった場所です。)
最初に自転車をデバイスとして AWS IoT にモノとして作成します。
Bike-1
の作成- 属性である
attributes
は適当です。(本記事では特に使いません)
- 属性である
aws iot create-thing --thing-name "Bike-1" \ --attribute-payload '{"attributes": {"model":"OEM-2302-12", "battery":"35", "acqDate":"06/09/23"}}'
作成できたら次のようなレスポンスが返ってきます。
{ "thingName": "Bike-1", "thingArn": "arn:aws:iot:ap-northeast-1:xxxxxxxxxxx:thing/Bike-1", "thingId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" }
Bike-2
の作成- 自転車1と同様に作成します。
aws iot create-thing --thing-name "Bike-2" \ --attribute-payload '{"attributes": {"model":"OEM-2302-10", "battery":"40", "acqDate":"17/02/22"}}'
次にデバイスシャドウを登録します。今回は「名前付きシャドウ」にしてみました。(クラシックシャドウでも構いません)
今回のアップデートではデバイスシャドウに位置情報を格納するのですが、Bike-1
と Bike-2
の位置情報は先ほど表に記載した通りとします。
Bike-1
の位置情報を登録
aws iot-data update-thing-shadow \ --thing-name Bike-1 \ --shadow-name Bike-shadow \ --cli-binary-format raw-in-base64-out \ --payload '{"state":{"reported":{"coordinates":{"lat": 35.669760, "lon": 139.753038}}}}' \ "output.txt"
Bike-2
の位置情報を登録
aws iot-data update-thing-shadow \ --thing-name Bike-2 \ --shadow-name Bike-shadow \ --cli-binary-format raw-in-base64-out \ --payload '{"state":{"reported":{"coordinates":{"lat": 35.697495, "lon": 139.774743}}}}' \ "output.txt"
それぞれ日比谷と秋葉原の位置情報をシャドウにセットできました。コンソール上では次のように Bike-shadow
というシャドウが見えているはずです。
登録した位置情報も格納されています。
次にフリートインデックスの設定を行います。既に他の作業で既存の設定があったので、マネジメントコンソールから設定しています。
メニューから Settings
の画面を開いて Fleet Indexing
の項目まで移動します。まだ Index location data
が未設定になっているので、画面右上の Manage Indexing
をクリックして編集します。
Configration
で Add shadow names
をクリックします。
(Add named shadows
にチェックが入っていなければ入れてください)
インデックスに利用するシャドウの名前を入力します(今回は Bike-shadow
)
追加されました。
次に Index location data
の部分で Add new field
をクリックします。
ここではインデックスしたいパスを指定します。
Data path
:shadow.name.Bike-shadow.reported.coordinates
- 書式:
shadow.name.[named_shadow_name].reported.coordinates
- 書式:
Sequence
:Lat, long
(デフォルトのまま)
セットできたら Update
をクリックして登録します。
これでフリートインデックスの設定が完了しました。
ジオクエリを試す
準備ができたので実際にクエリを発行してみます。今回は次の3パターンを試します。
- JR 新橋駅前から半径 5km 圏内にある自転車を検索
- JR 新橋駅前から半径 1km 圏内にある自転車を検索
- JR 新橋駅前から半径 1km 圏内より外側にある自転車を検出
JR 新橋駅前から半径 5km 圏内にある自転車を検索
次のコマンドを実行します。
ここで利用している 35.667283,139.757371
の位置情報は「JR 新橋駅前」のものです。JR 新橋駅前を起点として、半径 5km の距離内にある自転車をシャドウのデータを使って検索しています。
aws iot search-index --query-string "shadow.name.Bike-shadow.reported.coordinates:geo_distance,35.667283,139.757371,5km"
次のようなレスポンスが得られます。Bike-1
と Bike-2
の両方が検出できています。
(JR 新橋駅前を起点とすると日比谷と秋葉原は 5km 圏内になります)
{ "things": [ { "thingName": "Bike-1", "thingId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", "attributes": { "acqDate": "06/09/23", "battery": "35", "model": "OEM-2302-12" }, "shadow": "{\"name\":{\"Bike-shadow\":{\"reported\":{\"coordinates\":{\"lat\":35.66976,\"lon\":139.753038}},\"metadata\":{\"reported\":{\"coordinates\":{\"lat\":{\"timestamp\":1700205142},\"lon\":{\"timestamp\":1700205142}}}},\"hasDelta\":false,\"version\":1}}}" }, { "thingName": "Bike-2", "thingId": "yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy", "attributes": { "acqDate": "17/02/22", "battery": "40", "model": "OEM-2302-10" }, "shadow": "{\"name\":{\"Bike-shadow\":{\"reported\":{\"coordinates\":{\"lat\":35.697495,\"lon\":139.774743}},\"metadata\":{\"reported\":{\"coordinates\":{\"lat\":{\"timestamp\":1700205148},\"lon\":{\"timestamp\":1700205148}}}},\"hasDelta\":false,\"version\":1}}}" } ] }
JR 新橋駅前から半径 1km 圏内にある自転車を検索
次のコマンドを実行します。半径の値を変えただけのものになります。
aws iot search-index --query-string "shadow.name.Bike-shadow.reported.coordinates:geo_distance,35.667283,139.757371,1km"
レスポンスは次のとおり、日比谷フォートタワー付近にある Bike-1
のみとなりました。
{ "things": [ { "thingName": "Bike-1", "thingId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", "attributes": { "acqDate": "06/09/23", "battery": "35", "model": "OEM-2302-12" }, "shadow": "{\"name\":{\"Bike-shadow\":{\"reported\":{\"coordinates\":{\"lat\":35.66976,\"lon\":139.753038}},\"metadata\":{\"reported\":{\"coordinates\":{\"lat\":{\"timestamp\":1700205142},\"lon\":{\"timestamp\":1700205142}}}},\"hasDelta\":false,\"version\":1}}}" } ] }
JR 新橋から半径 1km 圏内より外側にある自転車を検出
次のコマンドを実行します。AND
, NOT
句を使ってクエリしています。
最初は NOT
句のみで検索したのですが、クラシックシャドウもヒットしてしまったので名前付きシャドウのみを検索対象とするために AND
句を使っています。
aws iot search-index --query-string "shadow.name.Bike-shadow.reported.coordinates:* AND (NOT shadow.name.Bike-shadow.reported.coordinates:geo_distance,35.667283,139.757371,1km)"
レスポンスは次の通り、秋葉原の産報佐久間ビル前にある Bike-2
のみとなりました。
{ "things": [ { "thingName": "Bike-2", "thingId": "yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy", "attributes": { "acqDate": "17/02/22", "battery": "40", "model": "OEM-2302-10" }, "shadow": "{\"name\":{\"Bike-shadow\":{\"reported\":{\"coordinates\":{\"lat\":35.697495,\"lon\":139.774743}},\"metadata\":{\"reported\":{\"coordinates\":{\"lat\":{\"timestamp\":1700205148},\"lon\":{\"timestamp\":1700205148}}}},\"hasDelta\":false,\"version\":1}}}" } ] }
最後に
今回のアップデートで簡単にデバイスの位置情報を基準にした検索ができるようになりました。
GPS 機能がないデバイスでも「AWS IoT Core Device Location」を使うことで位置情報を取得できるので、積極的に利用していきたいと思います。
以上です。